package coml.jiyun.hp.day08work.net;

import java.util.Map;

import coml.jiyun.hp.day08work.bean.WanBean;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Url;

public interface AllServer {

//    String baseUrl = "https://www.wanandroid.com/project/list/1/";
//
//    @GET("json?cid=294")
//    Observable<WanBean>getData();
//
//    @GET("json?cid=294")
//    Observable<WanBean>getData2(@Path("cid")int cid);
//
//    @POST("json?cid=294")
//    @FormUrlEncoded
//    Observable<WanBean>getData3(@Field("cid")int cid);


    //ResponseBody，响应体，没有转换成实体类
    @POST("user/login")
    Call<ResponseBody> getData(@Body RequestBody body);

    // @GET注解的作用:采用Get方法发送网络请求
    @GET("10/{page}")
    Call<WanBean> getData(@Path("page") int page);

    /**
     *method：网络请求的方法（区分大小写）
     * path：网络请求地址路径
     * @param page
     * @return
     */
    @HTTP(method = "GET", path="10/{page}", hasBody = false)
    Call<WanBean> getData2(@Path("page") int page);

    //请求头 @Header & @Headers

    @GET("user")
    Call<WanBean> getUser(@Header("Authorization") String authorization);


    // @Headers
    @Headers("Authorization: authorization")
    @GET("user")
    Call<WanBean> getUser();

    // 以上的效果是一致的。
    // 区别在于使用场景和使用方式
    // 1. 使用场景：@Header用于添加不固定的请求头，@Headers用于添加固定的请求头
    // 2. 使用方式：@Header作用于方法的参数；@Headers作用于方法


    //@Body

    @POST("user/login")
    Call<ResponseBody> getData3(@Body RequestBody body);


    // @Field & @FieldMap 表格
    @POST("/form")
    @FormUrlEncoded
    Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);


    //Map的key作为表单的键
    @POST("/form")
    @FormUrlEncoded
    Call<ResponseBody> testFormUrlEncoded2(@FieldMap Map<String, Object> map);


    //@Part & @PartMap
    @POST("/form")
    @Multipart
    Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

    @POST("/form")
    @Multipart
    Call<ResponseBody> testFileUpload2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);

    @POST("/form")
    @Multipart
    Call<ResponseBody> testFileUpload3(@PartMap Map<String, RequestBody> args);


    //@Query和@QueryMap

    @GET("/")
    Call<String> cate(@Query("cate") String cate);

    // @Path作用：URL地址的缺省值
    @GET("10/{page}")
    Call<WanBean> getData3(@Path("page") int page);
    // 在发起请求时， {page} 会被替换为方法的第一个参数 page（被@Path注解作用


    // @Url
    //
    //作用：直接传入一个请求的 URL变量 用于URL设置
    @GET
    Call<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);

}